<?php 
class imager extends Load_use
{
	/*Преобразовать название обрезанного изображниея в название оригинального изображения*/
	function getOriginalName()
	{
		$thumb_name=$this->getParam('thumb_name',false);		
		if($thumb_name)
			return  $this->getOriginalName_($thumb_name);
		return false;
	}
	function getOriginalName_($thumb_name)
	{ 
		if(preg_match_all('#^(.*/|)_((([^/]{1,3})_([a-z])(\d+)([a-z])_)|([^/]{2})_([a-z])(\d+)([a-z])_([^/]*)([^/])([^/]))(\.[\w]{2,4})$#i',$thumb_name,$res,PREG_SET_ORDER))
		{
			foreach($res as $val)
			{
				$name=$val[8].$val[14].$val[13].$val[12].$val[4];
				$len=strlen($name);
				if(($val[9]==$val[11] && $len==$val[10])||($val[5]==$val[7]) &&$len==$val[6])
					return array('name'=>$val[1].$name.$val[15],'size'=>strtolower($val[9].$val[7]));
			}
		}
		return false;
	}
	/*Преобразовать имя большого изображения в название обрезанного изображения*/
	function getThumbName()
	{		
		$original_name=$this->getParam('original_name',false);
		$size=$this->getParam('size',false);
		if($original_name && $size)
			return $this->getThumbName_($original_name,$size);
		return false;
	}
	function getThumbName_($original_name,$size)
	{
		if( preg_match('#^(.*/|)(([^/]{1,3})|([^/]{2})([^/])([^/])([^/]*))\.([\w]{2,4})$#',$original_name,$res))
		{
			return $res[1].'_'.$res[3].$res[4].'_'.$size.strlen($res[2]).$size.'_'.$res[7].$res[6].$res[5].'.'.$res[8];
		}
		return false;
	}
	function resize()
	{
		$source_name=$this->getParam('source_name',false);
		$new_name=$this->getParam('new_name',false);
		$width=$this->getParam('width',false);
		$height=$this->getParam('height',false);
		if(!$source_name || !$new_name || !$width || !$height)
			return false;
		$water_mark=$this->getParam('water_mark',false);
		$return_img=$this->getParam('return_img',false);
		return resize_($source_name,$new_name,$width,$height,$water_mark,$return_img);		
	}
	/*Author: Deemon
	 * TWImages
	 * Обрезка и наложение водяного знака 
	 * 
	 */
	function resize_($source_name,$new_name,$w,$h,$water_mark=false,$return_img=false)
	{
		$fmt=false;
		$type=array('jpg' =>'jpeg','jpeg' =>'jpeg','gif'=>'gif','png'=>'png');
		
		if(file_exists($source_name))//Проверка существования исходного файла
		{
			//Определяю тип файла
			$info=getimagesize($source_name);
			if(!$info) die('Не поддерживаемый формат файла');
			preg_match('#/(\w+)$#',$info['mime'],$res);
			if($res)$fmt=$res[1];
			else die('Не поддерживаемый формат файла');
			
			// Создаю изображение... 
			$image = imagecreatetruecolor($w,$h) 
			or die('Невозможно создать изображение');     // ...или прерываю работу скрипта в случае ошибки 
			
			// Заливаю фон белым
			imagefill($image, 10, 10, 0xFFFFFF);
			
			//Взависимости от типа выбираю функцию
			$func='imagecreatefrom'.$type[$fmt];
			//Создаю изображение-донор
			$source = $func($source_name)
			or die('Неправильный формат');

			//Выбираю масштаб изображения
			$procW=$info[0] / $w;
			$procH=$info[1] / $h;
			$procent=($procW > $procH)? $procW : $procH;
			
			//Массштабирую размеры 
			$massW=floor($info[0] / $procent);
			$massH=floor($info[1] / $procent);
			
			//Определяю координаты с учетом центрирования
			$x=floor(($w - $massW)/2);
			$y=floor(($h - $massH)/2);	
			
			
			// Копирую существующее изображение в новое с изменением размера:
			imagecopyresampled(
			$image,  // Идентификатор нового изображения
			$source,  // Идентификатор исходного изображения
			$x,$y,      // Координаты (x,y) верхнего левого угла в новом изображении
			0,0,      // Координаты (x,y) верхнего левого угла копируемого блока существующего изображения
			$massW,     // Новая ширина копируемого блока
			$massH,     // Новая высота копируемого блока
			$info[0], // Ширина исходного копируемого блока
			$info[1]  // Высота исходного копируемого блока
			);
			if($water_mark)//Если нужно наложить водяной значек
			{
				if(file_exists($water_mark))
				{
					//Определяю тип файла
					$info=getimagesize($water_mark);
					if(!$info) die('Не поддерживаемый формат файла');
					preg_match('#/(\w+)$#',$info['mime'],$res);
					if($res)$fmt=$res[1];
					else die('Не поддерживаемый формат файла');
					
					//Взависимости от типа выбираю функцию
					$func='imagecreatefrom'.$type[$fmt];
					//Создаю изображение водяного знака
					$woda = $func($water_mark)
					or die('Неправильный формат');

					if($w < $info[0] && $h < $info[1])
					{
						//Выбираю масштаб изображения
						$procW=$info[0] / $w;
						$procH=$info[1] / $h;
						$procent=($procW > $procH)? $procW : $procH;
						
						//Массштабирую размеры 
						$massW=floor($info[0] / $procent);
						$massH=floor($info[1] / $procent);
					}
					else
					{
						$massW=$info[0];
						$massH=$info[1];
					}
					//Определяю координаты с учетом центрирования
					$x=floor(($w - $massW)/2);
					$y=floor(($h - $massH)/2);	
					
					
					// Копирую существующее изображение в новое с изменением размера:
					imagecopyresampled(
					$image,  // Идентификатор нового изображения
					$woda,  // Идентификатор исходного изображения
					$x,$y,      // Координаты (x,y) верхнего левого угла в новом изображении
					0,0,      // Координаты (x,y) верхнего левого угла копируемого блока существующего изображения
					$massW,     // Новая ширина копируемого блока
					$massH,     // Новая высота копируемого блока
					$info[0], // Ширина исходного копируемого блока
					$info[1]  // Высота исходного копируемого блока
					);
					imagedestroy($woda);
				}
				else
					die('Файл водяного знака отсутствует');
			}
			
			//Взависимости от типа выбираем функцию
			//Сохраняю картинку
			preg_match('#\.(\w+)$#',$new_name,$res);
			if($res)$fmt=$res[1];
			$func='image'.$type[$fmt];
			if($type[$fmt]=='jpeg')//Если сжатая картинка то качество 
					$func($image, $new_name, 100);
			else
				$func($image, $new_name);	
			if($return_img)//Если выдавать картинку 
			{
				//Обозначаю тип в хедере
				header('Content-type: image/' . $type[$fmt]);
				$func($image);
			}			
			
			// Удаляю временные файлы
			imagedestroy($image);		
			imagedestroy($source);
		}
		else die('Отсутствует исходный файл');
		return true;
	}
}